#ifndef GLOBALAPPLICATION_H
#define GLOBALAPPLICATION_H

#include <QObject>
#include <QTimer>
#include <QApplication>
#include <QPointer>
#include <QDebug>
#include <QList>
#include <QWidget>
#include <QSharedMemory>
#include <QSystemSemaphore>

/**
 * @brief 全局应用程序类，继承自QApplication
 * 
 * 主要功能：
 * 1. 重载notify函数，处理全局事件
 * 2. 管理应用程序失去焦点时的行为
 * 3. 处理全局鼠标点击事件
 * 4. 支持单实例运行检测
 */
class GlobalApplication : public QApplication
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param argc 参数个数
     * @param argv 参数列表
     */
    explicit GlobalApplication(int& argc, char** argv);

    /**
     * @brief 析构函数
     */
    ~GlobalApplication();

    /**
     * @brief 重载notify函数，用于处理全局事件
     * @param obj 事件目标对象
     * @param event 事件对象
     * @return 事件是否被处理
     */
    bool notify(QObject* obj, QEvent* event) override;

    /**
     * @brief 检查是否已有实例在运行
     * @return true表示已有实例运行，false表示当前是唯一实例
     */
    bool isInstanceRunning() const;

    /**
     * @brief 激活已运行的实例
     */
    void activateExistingInstance();

signals:
    /**
     * @brief 当检测到已有实例运行时发出的信号
     */
    void instanceAlreadyRunning();

private:
    /**
     * @brief 处理应用程序失去焦点事件
     */
    void handleApplicationDeactivated();

    /**
     * @brief 处理鼠标按下事件，关闭不在点击范围内的弹出窗口
     * @param globalPos 鼠标全局位置
     */
    void handleMousePress(const QPoint& globalPos);

    /**
     * @brief 检查并关闭窗口（如果点击位置不在窗口内）
     * @param widget 要检查的窗口
     * @param globalPos 鼠标全局位置
     */
    void closeWidgetIfOutside(QWidget* widget, const QPoint& globalPos);

private:
    QSharedMemory* m_sharedMemory;      // 用于单实例检测的共享内存
    bool m_isFirstInstance;             // 是否是第一个实例
};

#endif // GLOBALAPPLICATION_H
